package cn.kgc.service;

import cn.kgc.entity.MessageInfo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;


/**
 * @author YC
 */
public interface MessageInfoService extends IService<MessageInfo> {

    /**
     * 根据消息的ID获得消息
     *
     * @param id 消息ID
     * @return 消息实例
     */
    MessageInfo getTransMessage(String id);

    /**
     * 发送消息前保存消息
     *
     * @param exchange    交换机
     * @param routingKey  routingKey
     * @param body        消息体
     * @param serviceName 服务名称
     * @param delayTime   延迟时间
     * @return 消息实例
     */
    MessageInfo messageSendReady(String exchange, String routingKey, String body, String serviceName, long delayTime);

    /**
     * 消息发送成功
     *
     * @param id 消息ID
     */
    void messageSendSuccess(String id);

    /**
     * 消息成功进入交换机,删除消息
     *
     * @param id 消息ID
     */
    void messageDelete(String id);

    /**
     * 消息没有进入到队列中,将消息重新持久化
     *
     * @param exchange    交换机
     * @param routingKey  路由key
     * @param body        消息体
     * @param sequence    消息序号
     * @param serviceName 服务名称
     * @param delayTime   延迟时间
     * @return 消息实例
     */
    MessageInfo messageSendReturn(String exchange, String routingKey, String body, int sequence, String serviceName, long delayTime);

    /**
     * 定时任务查询应发和未发的消息
     *
     * @return 消息列表
     */
    List<MessageInfo> listReadyMessage();

    /**
     * 增加消息发送次数
     *
     * @param id 消息ID
     */
    void messageResend(String id);

    /**
     * 消息重发超过最大限制数，将消息状态改为死亡
     *
     * @param id 消息ID
     */
    void messageMaxDead(String id);

    /**
     * 消息多次消费，将消息状态改为死亡
     *
     * @param id 消息ID
     */
    void messageReceiveDead(String id);

    /**
     * 判断消息是否存在数据库中，是则更新属性（消费次数+1），否则持久化数据
     *
     * @param id         消息ID
     * @param exchange   交换机
     * @param routingKey 路由key
     * @param queue      队列
     * @param body       消息体
     * @param delayTime  延迟时间
     * @return 消息实例
     */
    MessageInfo messageReceiveReady(String id, String exchange, String routingKey, String queue, String body, long delayTime);

    /**
     * 如果消息处理成功 从队列中删除消息
     *
     * @param id 消息ID
     */
    void messageReceiveSuccess(String id);


}
